/**
 * Token 验证中间件：token是否有效或过期
 * 作为敏感路由的前置守卫中间件
 */

const jwt = require('jsonwebtoken')
const config = require('../config')
const db = require('../db/index')

const authenticateToken = async (req, res, next) => {
  console.log('后端authMiddleware', req.cookies)
  
  const token = req.cookies.token

  if (!token) {
    return res.status(401).json({
      code: 401,
      message: '您还未登录，请先登录'
    })
  }

  try {
    // 验证accessToken
    const decoded = jwt.verify(token, config.jwtSecretKey)
    
    // 验证用户是否仍然存在于数据库中
    const sql = 'SELECT id, username, phone, email, status FROM user WHERE id = ?'
    db.query(sql, [decoded.id], (err, results) => {
      if (err) {
        console.error('数据库查询错误:', err)
        return res.status(500).json({
          code: 500,
          message: '服务器内部错误'
        })
      }
      
      if (results.length === 0) {
        return res.status(401).json({
          code: 401,
          message: '用户不存在，请重新登录'
        })
      }
      
      const user = results[0]
      
      // 检查用户状态（如果数据库有status字段）
      if (user.status === 'disabled') {
        return res.status(403).json({
          code: 403,
          message: '账户已被禁用'
        })
      }
      
      // 将用户信息挂载到req上供后续使用
      req.user = {
        id: user.id,
        username: user.username,
        phone: user.phone,
        email: user.email,
      }
      
      next()
    })
  } catch (error) {
    console.error('Token验证错误:', error.message)
    
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        code: 401,
        message: '登录已过期，请重新登录'
      })
    } else if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        code: 401,
        message: '无效的登录凭证'
      })
    } else {
      return res.status(500).json({
        code: 500,
        message: '服务器内部错误'
      })
    }
  }
}

module.exports = authenticateToken